iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
AI & Data

OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐系列 第 21

Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇- Native Function 多參數傳遞

  • 分享至 

  • xImage
  •  

前言

到目前為所寫的Native Function都是只有一個參數的,但現實場景中多個參數的運用是很常見的需求,本篇內容就來介紹如何建立與使用多參數的Native Function。

範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。

至目前為止本系列文中的範例皆採用Microsoft.SemanticKernel套件,版號為0.24.230918.1-preview,然而下週Semantic Kernel預計會正式發行1.0版,因此後面文章若遇到1.0版發行,則會直接使用1.0版,而前面文章的範例,也會另行找時間更新,github上的程式碼也會同時更新。

Semantic Function調用Native Function

  • 情境假設,依前篇範例做調整,Native Function 改為"根據客戶代碼及區域,取得客戶連絡人",所以需要2個參數,Native Function方法簽章改為接收SKContext物件做為input參數,而SKContext物件內容會包含所有的輸入參數,在Native Function內部透過context.Variables["xxxx"]方式來取得參數值。
[SKFunction, Description("根據客戶代碼及區域,取得客戶連絡人")]
public string GetCustomerContactV2(SKContext context)
{
    //撰寫從CRM DataBase 取得客戶連絡人資料邏輯
    //do something
    return $"{context.Variables["CusCode"]}-{context.Variables["Area"]} 居匹踢";
}
  • 調整semantic Functio的Prompt設計,直接以{CrmPlugin.GetCustomerContactV2}}語法調用Native Function,並且不用給與任何參數
你是一位行政助理,負責處理我所交辧的文書作業任務
現在,請幫我寫一封信給
"""
{{CrmPlugin.GetCustomerContactV2}}
"""
內容是下星期1開始我將休假1個月,有任何緊急事項,可以連繫公司代理人
  • Import Native Function與 semantic Function,這個部份與前面範例寫法相同
// Load native plugin into the kernel function collection
// Functions loaded here are available as "CrmPlugin.*"
var crmPlugin = kernel.ImportSkill(new Plugins.CrmPlugin.Customer(), "CrmPlugin");

// Import the Plugin from the plugins directory.
var pluginsDirectory = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Plugins");
var writePlugin = kernel.ImportSemanticSkillFromDirectory(pluginsDirectory, "WriterPlugin");
  • 建立ContextVariables物件,並設定Import Native Function與 semantic Function所需要的參數
var contextVars = new ContextVariables()
{
    ["CusCode"] = "C2023001",
    ["Area"] = "KH"
};
  • 調用 semantic Function,並傳入ContextVariables物件,這時候在整個writePlugin執行過程中所有透過ContextVariables置入的參數式將會被保留,上下的funtion都可以取得其變數內容。
var result = await kernel.RunAsync(contextVars, writePlugin["Email2"]);
  • 生成結果
    https://ithelp.ithome.com.tw/upload/images/20231006/2012656942aW3HySSs.png

觀看SKContext的建構子,在產生SKContext物件時需要ContextVariables參數,因此可以知道當native function被調用時,所注入的SKContext物件會包含所有的傳送到function的參數

public SKContext(
    ContextVariables? variables = null,
    IReadOnlySkillCollection? skills = null,
    ILoggerFactory? loggerFactory = null)
{
    this.Variables = variables ?? new();
    this.Skills = skills ?? NullReadOnlySkillCollection.Instance;
    this.LoggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
    this._culture = CultureInfo.CurrentCulture;
}

範例原始碼 : https://github.com/iangithub/sklearn/tree/main/MixSemanticFunAndNativeFun

結語

本篇探討如何為Native Function 實現傳送多參數的機制,這個機制的核心關鍵就在SKContext 物件。當Native Function被調用時,會自動注入SKContext 物件,而此物件會包含所有由ContextVariables物件配置的參數值,因此便能實現多參數的傳送。下一篇將介紹semantic kernel內建開箱即用的Plugins。

嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500


上一篇
Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 Semantic Function調用Native Function
下一篇
Semantic Kernel的實踐:Semantic Kernel - 開箱即用Plugins
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言